package model.lugares;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.jdom2.Element;

@SuppressWarnings("rawtypes")
public class Ciudad implements Comparable {
		
	private int CANT_EDIFICIOS = 3;
	private String nombre;
	private String pais;
	public String descripcion;
	private double coordenadas[] = new double[2]; //para calcular distancias
	private ArrayList<Edificio> edificios = new ArrayList<Edificio>();
	//public static int INDEX_E_MONEDA = 0;
	//public static int INDEX_E_PUBLICO = 1;
	//public static int INDEX_E_TRANSPORTE = 2;
	
	public Ciudad(String nombre_c, String n_pais, String descripcion1, double latitud, double longitud) {
		nombre = nombre_c;
		pais = n_pais;
		descripcion = descripcion1;
		coordenadas[0] = latitud;
		coordenadas[1] = longitud;
	}
	
	public String toString() {
		return (nombre + ", " + pais);
	}
	
	public double[] getCoordenadas() {
		return coordenadas;
	}
	
	public String getNombrePais(){
		return pais;
	}
	
	/*public void agregar_edificios(Edificio e_moneda, Edificio biblioteca, Edificio e_transporte) {
		edificios.add(e_moneda);
		edificios.add(biblioteca);
		edificios.add(e_transporte);		
	}*/

	/*public void dejarPistaEnEdificioMoneda(String pista) {
		
		edificios.get(INDEX_E_MONEDA).agregarPista(pista);
		
	}

	public void dejarPistaEnEdificioBiblioteca(String pistaADejar) {
		
		edificios.get(INDEX_E_PUBLICO).agregarPista(pistaADejar);
	}

	public void dejarPistaEnEdificioTransporte(String pistaADejar) {
		
		edificios.get(INDEX_E_TRANSPORTE).agregarPista(pistaADejar);
	}
	
	public String getTipoEdificioMoneda()
	{
		return edificios.get(INDEX_E_MONEDA).nombre;
	}
	
	public String getTipoEdificioPublico()
	{
		return edificios.get(INDEX_E_PUBLICO).nombre;
	}
	

	public String getTipoEdificioTransporte()
	{
		return edificios.get(INDEX_E_TRANSPORTE).nombre;
	}*/
	
	@Override
	public int compareTo(Object arg0) {
		Ciudad ciudadAComparar=(Ciudad) arg0; 
		
		return (this.toString().compareTo(ciudadAComparar.toString()));
	}
	
	public static Ciudad hidratar(Element nodo){
		String nombre = nodo.getAttribute("nombre").getValue();
		String pais = nodo.getChild("pais").getValue();
		String descripcion = nodo.getChild("descripcion").getValue();
		Double latitud = Double.parseDouble(nodo.getChild("latitud").getValue());
		Double longitud = Double.parseDouble(nodo.getChild("longitud").getValue());
		Ciudad ciudad = new Ciudad(nombre,pais,descripcion,latitud,longitud);
		
		Element nodoEdificio = nodo.getChild("edificios");
		List<Element> edificios =  nodoEdificio.getChildren();
		for (Element edi : edificios){
			ciudad.agregar_edificio(Edificio.hidratar(edi));
		}
		
		return ciudad;
	}
	
	public void agregar_edificio(Edificio edificio) {
		edificios.add(edificio);
	
		if((edificio.pista==null)||(edificio.getPista().isEmpty()))
			edificio.agregarPista("Todas las personas consultadas hablan de una persona muy sospechosa en la ciudad.");
	}

	public String getNombre() {
		return nombre;
	}

	/*public String getPistaMoneda() {
		return edificios.get(INDEX_E_MONEDA).getPista();
	}

	public String getPistaPublico() {
		return edificios.get(INDEX_E_PUBLICO).getPista();
	}

	public String getPistaTransporte() {
		return edificios.get(INDEX_E_TRANSPORTE).getPista();
	}*/
	
	public Edificio getEdificioAlAzar(){
		Random rdm = new Random();
		return edificios.get(rdm.nextInt(CANT_EDIFICIOS));
	}
	
	public int calcularDistanciaA(Ciudad ciudad) {
		// Uso la formula de Haversine
		double[] coorAIr = ciudad.getCoordenadas();
		final double R = 6372.8; // Radio tierra en km
		double lat1 = coordenadas[0];
		double lon1 = coordenadas[1];
		double lat2 = coorAIr[0];
		double lon2 = coorAIr[1];
		
		double dLat = Math.toRadians(lat2 - lat1);
		double dLon = Math.toRadians(lon2 - lon1);
		lat1 = Math.toRadians(lat1);
		lat2 = Math.toRadians(lat2);

		double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
		double c = 2 * Math.asin(Math.sqrt(a));
		return (int) (R * c);
	}

	public ArrayList<Edificio> getEdificios() {
		return edificios;
	}
	

}
